"""
资源监控工具 - 主窗口界面
使用tkinter实现简洁的资源监控界面
"""

import tkinter as tk
from tkinter import ttk
import time
import monitor

class ResourceMonitorApp:
    def __init__(self, root):
        """初始化应用"""
        self.root = root
        self.root.title("资源监控")
        self.root.geometry("300x200")  # 初始窗口大小
        self.root.resizable(False, False)  # 禁止调整大小，保持小巧
        
        # 允许从任务栏图标关闭窗口时，窗口可以被正确关闭
        self.root.protocol("WM_DELETE_WINDOW", self.on_close)
        
        # 刷新间隔 (毫秒)
        self.refresh_interval = 1000
        
        # 记录更新定时器ID
        self.update_timer_id = None
        
        # 创建UI元素
        self.create_widgets()
        
        # 强制窗口更新以确保所有控件都已绘制
        self.root.update_idletasks()
        
        # 首次更新数据 (初始化网络速度基准)
        monitor.get_network_speed()
        
        # 强制更新界面
        print("窗口创建完成，窗口尺寸：", self.root.winfo_width(), "x", self.root.winfo_height())
        
        # 立即更新数据一次
        self.update_stats(first_run=True)
        
    def on_close(self):
        """处理窗口关闭事件"""
        # 如果是独立窗口模式，关闭则退出
        # 如果是作为托盘应用的窗口，关闭则隐藏（由托盘应用控制）
        
        # 此方法会被托盘应用的 _hide_window 覆盖
        # 所以仅当直接运行此文件时，此方法才会实际调用 destroy()
        print("窗口关闭事件被触发")
        self.root.destroy()
        
    def create_widgets(self):
        """创建界面组件"""
        # 主框架
        main_frame = ttk.Frame(self.root, padding="10")
        main_frame.pack(fill=tk.BOTH, expand=True)
        
        # 样式设置
        style = ttk.Style()
        style.configure("TLabel", font=("微软雅黑", 10))
        style.configure("Header.TLabel", font=("微软雅黑", 10, "bold"))
        style.configure("Value.TLabel", font=("Consolas", 10), foreground="#007acc")
        
        # 创建不同颜色的样式
        style.configure("Blue.TLabel", font=("Consolas", 10), foreground="#007acc")
        style.configure("Orange.TLabel", font=("Consolas", 10), foreground="#ff8c00")
        style.configure("Red.TLabel", font=("Consolas", 10), foreground="#e81123")
        
        # 标题
        header = ttk.Label(main_frame, text="Windows 系统资源监控", style="Header.TLabel")
        header.pack(pady=(0, 10))
        
        # CPU 使用率
        cpu_frame = ttk.Frame(main_frame)
        cpu_frame.pack(fill=tk.X, pady=2)
        
        ttk.Label(cpu_frame, text="CPU 使用率:", width=15, anchor=tk.W).pack(side=tk.LEFT)
        self.cpu_var = tk.StringVar(value="计算中...")
        self.cpu_label = ttk.Label(cpu_frame, textvariable=self.cpu_var, style="Value.TLabel")
        self.cpu_label.pack(side=tk.LEFT)
        
        # 内存使用率
        mem_frame = ttk.Frame(main_frame)
        mem_frame.pack(fill=tk.X, pady=2)
        
        ttk.Label(mem_frame, text="内存使用率:", width=15, anchor=tk.W).pack(side=tk.LEFT)
        self.mem_var = tk.StringVar(value="计算中...")
        self.mem_label = ttk.Label(mem_frame, textvariable=self.mem_var, style="Value.TLabel")
        self.mem_label.pack(side=tk.LEFT)
        
        # 网络上传速度
        up_frame = ttk.Frame(main_frame)
        up_frame.pack(fill=tk.X, pady=2)
        
        ttk.Label(up_frame, text="上传速度:", width=15, anchor=tk.W).pack(side=tk.LEFT)
        self.upload_var = tk.StringVar(value="计算中...")
        ttk.Label(up_frame, textvariable=self.upload_var, style="Value.TLabel").pack(side=tk.LEFT)
        
        # 网络下载速度
        down_frame = ttk.Frame(main_frame)
        down_frame.pack(fill=tk.X, pady=2)
        
        ttk.Label(down_frame, text="下载速度:", width=15, anchor=tk.W).pack(side=tk.LEFT)
        self.download_var = tk.StringVar(value="计算中...")
        ttk.Label(down_frame, textvariable=self.download_var, style="Value.TLabel").pack(side=tk.LEFT)
        
        # 最后更新时间
        time_frame = ttk.Frame(main_frame)
        time_frame.pack(fill=tk.X, pady=(10, 0))
        
        ttk.Label(time_frame, text="最后更新:", width=15, anchor=tk.W).pack(side=tk.LEFT)
        self.time_var = tk.StringVar(value="---")
        ttk.Label(time_frame, textvariable=self.time_var, style="Value.TLabel").pack(side=tk.LEFT)
        
        # 底部信息
        footer = ttk.Label(main_frame, text="按ESC键退出", font=("微软雅黑", 8))
        footer.pack(pady=(10, 0))
        
        # 绑定ESC键退出
        self.root.bind("<Escape>", lambda e: self.on_close())
        
        # 绑定窗口可见性事件
        self.root.bind("<Map>", self._on_window_shown)
        self.root.bind("<Unmap>", self._on_window_hidden)

    def _on_window_shown(self, event):
        """窗口变为可见时调用"""
        print("窗口已显示")
        # 立即更新数据
        self.update_stats(first_run=True)
    
    def _on_window_hidden(self, event):
        """窗口被隐藏时调用"""
        # 如果需要在窗口隐藏时暂停更新，可以在这里处理
        print("窗口已隐藏")
        pass

    def update_stats(self, first_run=False):
        """更新所有系统资源数据"""
        try:
            print("更新数据中...")
            # 更新CPU使用率
            cpu_percent = monitor.get_cpu_usage()
            self.cpu_var.set(f"{cpu_percent:.1f}%")
            
            # 更新内存使用率
            mem_percent = monitor.get_memory_usage()
            self.mem_var.set(f"{mem_percent:.1f}%")
            
            # 更新网络速度
            upload, download = monitor.get_network_speed()
            self.upload_var.set(upload)
            self.download_var.set(download)
            
            # 更新时间
            current_time = time.strftime("%H:%M:%S")
            self.time_var.set(current_time)
            
            # 根据资源使用情况改变颜色
            self._update_colors(cpu_percent, mem_percent)
            
        except Exception as e:
            print(f"更新数据时出错: {e}")
        
        # 如果窗口存在且可见，安排下一次更新
        if self.root.winfo_exists():
            # 取消已有定时器（如果存在）
            if self.update_timer_id:
                self.root.after_cancel(self.update_timer_id)
            
            # 注册新的定时器
            self.update_timer_id = self.root.after(self.refresh_interval, self.update_stats)
            print(f"安排下一次更新，定时器ID: {self.update_timer_id}")
    
    def _update_colors(self, cpu_percent, mem_percent):
        """根据资源使用率更新颜色"""
        # CPU颜色: < 60% 蓝色, 60-85% 橙色, > 85% 红色
        if cpu_percent < 60:
            self.cpu_label.configure(style="Blue.TLabel")
        elif cpu_percent < 85:
            self.cpu_label.configure(style="Orange.TLabel")
        else:
            self.cpu_label.configure(style="Red.TLabel")
        
        # 内存颜色: < 70% 蓝色, 70-90% 橙色, > 90% 红色
        if mem_percent < 70:
            self.mem_label.configure(style="Blue.TLabel")
        elif mem_percent < 90:
            self.mem_label.configure(style="Orange.TLabel")
        else:
            self.mem_label.configure(style="Red.TLabel")

# 如果直接运行此文件
if __name__ == "__main__":
    root = tk.Tk()
    app = ResourceMonitorApp(root)
    root.mainloop() 